package gui;

import java.util.LinkedList;

/**
 * ao carregar todas as classes de um projeto especificado pelo usuario, pode ser que o projeto
 * tenha MUITAS classes e seria interessante mostrar as classes que o jogador pode querer testar
 * em seus respectivos pacotes.
 *
 */
public class GerenciaNomesDasClassesCarregadasEmSeusPacotes 
{
	private LinkedList<Class> classesCarregadas;
	private LinkedList<String> pacotesDasClassesCarregadas;
	
	
	public GerenciaNomesDasClassesCarregadasEmSeusPacotes(LinkedList<Class> classesCarregadasDoProjeto)
	{
		this.classesCarregadas = classesCarregadasDoProjeto;
		pacotesDasClassesCarregadas = new LinkedList<String>();
		//vamos pegar os nomes dos pacotes das classes carregadas
		for(int i = 0; i < classesCarregadas.size(); i++)
		{
			Class classeCarregada = this.classesCarregadas.get(i);
			String nomeEPacoteClasseCarregada = classeCarregada.getName();
			String sohNomeClasseCarregada = classeCarregada.getSimpleName();
			String pacoteClasseCarregada = nomeEPacoteClasseCarregada.replace("." + sohNomeClasseCarregada, "");
			pacoteClasseCarregada = pacoteClasseCarregada.replace(sohNomeClasseCarregada, "");
			if(pacoteJahEstahInseridoNaListaDePacotes(pacoteClasseCarregada) == false)
			{
				pacotesDasClassesCarregadas.add(pacoteClasseCarregada);
			}
		}
	}
	
	private boolean pacoteJahEstahInseridoNaListaDePacotes(String nomePacote)
	{
		for(int i = 0; i < pacotesDasClassesCarregadas.size(); i++)
		{
			String pacoteJahNaLista = this.pacotesDasClassesCarregadas.get(i);
			if(pacoteJahNaLista.compareTo(nomePacote) == 0)
			{
				//o pacote ja estah na lista, entao vamos retornar true
				return true;
			}
		}
		
		return false;
	}
	
	public LinkedList<String> getPacotesDasClassesCarregadas()
	{
		return this.pacotesDasClassesCarregadas;
	}
	
	/**
	 * dado o nome de um pacote, esse metodo vai retornar as classes carregadas(especificadas no construtor dessa classe)
	 * que estao contidas dentro do pacote passado como parametro
	 * @param nomePacote nome do pacote em que se baseara o criterio de procurar por classes carregadas(especificadas no construtor dessa classe)
	 * @return classes carregadas que estao dentro do pacote especificado
	 */
	public LinkedList<Class> retornarClassesCarregadasQueEstaoDentroDoPacote(String nomePacote)
	{
		LinkedList<Class> classesDentroDoPacote = new LinkedList<Class>();
		for(int i = 0; i < this.classesCarregadas.size(); i++)
		{
			Class classeCarregada = this.classesCarregadas.get(i);
			String nomeEPacoteClasseCarregada = classeCarregada.getName();
			if(nomeEPacoteClasseCarregada.contains(nomePacote))
			{
				classesDentroDoPacote.add(classeCarregada);
			}
		}	
		return classesDentroDoPacote;
	}
	
	/*essa funcao so serah chamada pela FachadaManipulacaoClasses... se o projeto nao tiver pacotes*/
	public LinkedList<Class> retornarClassesTodasAsClassesCarregadas()
	{
		return this.classesCarregadas;
	}
	
	

}
